package com.test.aop;

/**
 * DefaultPointcutAdvisor类实现了PointcutAdvisor接口，用于提供一个基于切点的顾问实现
 * 它允许用户指定一个切点和一个通知，以便在AOP框架中使用
 */
public class DefaultPointcutAdvisor implements PointcutAdvisor{

    // 存储通知的变量
    private Advice advice;
    // 存储切点的变量，默认为匹配所有目标的切点
    private Pointcut pointcut = Pointcut.TRUE;


    // 默认构造函数
    public DefaultPointcutAdvisor() {
    }

    // 构造函数，允许在创建实例时设置通知
    public DefaultPointcutAdvisor(Advice advice) {
        this.advice = advice;
    }

    // 构造函数，允许在创建实例时同时设置切点和通知
    public DefaultPointcutAdvisor(Pointcut pointcut, Advice advice) {
        this.pointcut = pointcut;
        this.advice = advice;
    }

    // 设置通知的方法
    public void setAdvice(Advice advice) {
        this.advice = advice;
    }

    // 设置切点的方法
    public void setPointcut(Pointcut pointcut) {
        this.pointcut = pointcut;
    }

    // 获取切点的方法，返回当前实例的切点
    @Override
    public Pointcut getPointcut() {
        return this.pointcut;
    }

    // 获取通知的方法，返回当前实例的通知
    @Override
    public Advice getAdvice() {
        return this.advice;
    }

    // 判断是否为每个实例提供单独的通知实例的方法，返回true表示是
    @Override
    public boolean isPerInstance() {
        return true;
    }
}
